# -*- coding: utf-8 -*-
import datetime
import hashlib
import json
import re
import time

import requests
import scrapy
from dateutil.parser import parse
from dateutil.relativedelta import relativedelta

from apps.listed_company.listed_company.items import ListedCompanyItem, NetListedCompanyYearReportItem, NetListedCompanyValuationDataDetailsItem, NetListedCompanyIndustryItem
from loguru import logger

from components.config import NET_ROBOT_MYSQL_CONFIG
from utils.db.mysqldb import MysqlDB
from utils.time_tools import get_random_date_list
from utils.tools import urlencode, urldecode
import oss2


class JuchaoSpider(scrapy.Spider):
    listed_exchange = '巨潮咨询'
    name = 'juchao'
    headers = {
        "Accept": "application/json, text/plain, */*",
        "Accept-Language": "zh,zh-TW;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6",
        "Proxy-Connection": "keep-alive",
        "Referer": "http://www.cninfo.com.cn/new/disclosure/stock?stockCode=000011&orgId=gssz0000011&sjstsBond=false",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
    }
    cookies = {
        "SF_cookie_4": "90357558",
        "insert_cookie": "45380249",
        "routeId": ".uc2",
        "_sp_id.2141": "218a2fc2-fea1-408d-9fd2-1feabf19026a.1728439540.2.1728456630.1728439540.3a926b7e-77aa-4a47-966e-1dfc17cb05a9",
        "SID": "99a05e01-1044-4192-87a4-4cbc1c6df1fb",
        "cninfo_user_browse": "000011,gssz0000011,%E6%B7%B1%E7%89%A9%E4%B8%9AA"
    }
    INDUSTRY1 = {
        'A': '农、林、牧、渔业',
        'B': '采矿业',
        'C': '制造业',
        'D': '电力、热力、燃气及水生产和供应业',
        'E': '建筑业',
        'F': '批发和零售业',
        'G': '交通运输、仓储和邮政业',
        'H': '住宿和餐饮业',
        'I': '信息传输、软件和信息技术服务业',
        'J': '金融业',
        'K': '房地产业',
        'L': '租赁和商务服务业',
        'M': '科学研究和技术服务业',
        'N': '水利、环境和公共设施管理业',
        'O': '居民服务、修理和其他服务业',
        'P': '教育',
        'Q': '卫生和社会工作',
        'R': '文化、体育和娱乐业',
        'S': '公共管理、社会保障和社会组织',
        'T': '国际组织',
    }
    INDUSTRY2_AND_FATHER_CODE = {
        '农业': 'A',
        '林业': 'A',
        '畜牧业': 'A',
        '渔业': 'A',
        '农、林、牧、渔专业及辅助性活动': 'A',
        '煤炭开采和洗选业': 'B',
        '石油和天然气开采业': 'B',
        '黑色金属矿采选业': 'B',
        '有色金属矿采选业': 'B',
        '非金属矿采选业': 'B',
        '开采专业及辅助性活动': 'B',
        '其他采矿业': 'B',
        '农副食品加工业': 'C',
        '食品制造业': 'C',
        '酒、饮料和精制茶制造业': 'C',
        '烟草制品业': 'C',
        '纺织业': 'C',
        '纺织服装、服饰业': 'C',
        '皮革、毛皮、羽毛及其制品和制鞋业': 'C',
        '木材加工和木、竹、藤、棕、草制品业': 'C',
        '家具制造业': 'C',
        '造纸和纸制品业': 'C',
        '印刷和记录媒介复制业': 'C',
        '文教、工美、体育和娱乐用品制造业': 'C',
        '石油、煤炭及其他燃料加工业': 'C',
        '化学原料和化学制品制造业': 'C',
        '医药制造业': 'C',
        '化学纤维制造业': 'C',
        '橡胶和塑料制品业': 'C',
        '非金属矿物制品业': 'C',
        '黑色金属冶炼和压延加工业': 'C',
        '有色金属冶炼和压延加工业': 'C',
        '金属制品业': 'C',
        '通用设备制造业': 'C',
        '专用设备制造业': 'C',
        '汽车制造业': 'C',
        '铁路、船舶、航空航天和其他运输设备制造业': 'C',
        '电气机械和器材制造业': 'C',
        '计算机、通信和其他电子设备制造业': 'C',
        '仪器仪表制造业': 'C',
        '其他制造业': 'C',
        '废弃资源综合利用业': 'C',
        '金属制品、机械和设备修理业': 'C',
        '电力、热力生产和供应业': 'D',
        '燃气生产和供应业': 'D',
        '水的生产和供应业': 'D',
        '房屋建筑业': 'E',
        '土木工程建筑业': 'E',
        '建筑安装业': 'E',
        '建筑装饰、装修和其他建筑业': 'E',
        '批发业': 'F',
        '零售业': 'F',
        '铁路运输业': 'G',
        '道路运输业': 'G',
        '水上运输业': 'G',
        '航空运输业': 'G',
        '管道运输业': 'G',
        '多式联运和运输代理业': 'G',
        '装卸搬运和仓储业': 'G',
        '邮政业': 'G',
        '住宿业': 'H',
        '餐饮业': 'H',
        '电信、广播电视和卫星传输服务': 'I',
        '互联网和相关服务': 'I',
        '软件和信息技术服务业': 'I',
        '货币金融服务': 'J',
        '资本市场服务': 'J',
        '保险业': 'J',
        '其他金融业': 'J',
        '房地产业': 'K',
        '租赁业': 'L',
        '商务服务业': 'L',
        '研究和试验发展': 'M',
        '专业技术服务业': 'M',
        '科技推广和应用服务业': 'M',
        '水利管理业': 'N',
        '生态保护和环境治理业': 'N',
        '公共设施管理业': 'N',
        '土地管理业': 'N',
        '居民服务业': 'O',
        '机动车、电子产品和日用产品修理业': 'O',
        '其他服务业': 'O',
        '教育': 'P',
        '卫生': 'Q',
        '社会工作': 'Q',
        '新闻和出版业': 'R',
        '广播、电视、电影和录音制作业': 'R',
        '文化艺术业': 'R',
        '体育': 'R',
        '娱乐业': 'R',
        '中国共产党机关': 'S',
        '国家机构': 'S',
        '人民政协、民主党派': 'S',
        '社会保障': 'S',
        '群众团体、社会团体和其他成员组织': 'S',
        '基层群众自治组织及其他组织': 'S',
        '国际组织': 'T',
    }
    to_db = MysqlDB(
        ip=NET_ROBOT_MYSQL_CONFIG["MYSQL_IP"],
        port=NET_ROBOT_MYSQL_CONFIG['MYSQL_PORT'],
        db=NET_ROBOT_MYSQL_CONFIG['MYSQL_DB'],
        user_name=NET_ROBOT_MYSQL_CONFIG['MYSQL_USER_NAME'],
        user_pass=NET_ROBOT_MYSQL_CONFIG['MYSQL_USER_PASS'],
    )

    custom_settings = {
        "HTTPERROR_ALLOWED_CODES": [400, 404, 500, 200, 202, 502],
        "RETRY_TIMES": 3,
        "RETRY_HTTP_CODES": [],
    }

    def start_requests(self):
        url = "http://www.cninfo.com.cn/data20/companyOverview/getCompanyIntroduction"
        sql = "SELECT stock_code, stock_abb FROM `net_robot`.`net_listed_company_info` ORDER BY `id` DESC LIMIT 0,1000"
        stock_code_list = self.to_db.find(sql)
        for stock_code, stock_abb in stock_code_list:
            params = {
                "scode": stock_code
            }
            yield scrapy.Request(url + "?" + urlencode(params), callback=self.parse_list, cookies=self.cookies, headers=self.headers, meta={'params': params, 'stock_abb': stock_abb, 'stock_code': stock_code})

    def parse_list(self, response, **kwargs):
        print(response.text[:100])
        if '错误的股票代码' in response.text:
            return
        stock_code = response.meta.get("stock_code")
        stock_abb = response.meta.get("stock_abb")
        industry2 = response.json()["data"]["records"][0]["basicInformation"][0]["F032V"]
        item = NetListedCompanyIndustryItem(**{
            'stock_code': stock_code,
            'stock_abb': stock_abb,
            'industry1': self.INDUSTRY1[self.INDUSTRY2_AND_FATHER_CODE[industry2]],
            'industry2': industry2,
        })
        print(item)
        yield item


if __name__ == "__main__":
    from scrapy import cmdline

    cmdline.execute("scrapy crawl juchao".split())
